/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package technotheist.imgcog.net.recurrent;

import technotheist.imgcog.base.Module;
import technotheist.imgcog.base.BaseConfig;

/**
 * This project is the intellectual property and only to be used under license 
 * guidelines. Please see the containing license.txt file for license information
 * and availability of use. The author takes no responsibility for any damage
 * or non-functionality caused by use of this software.
 *
 * For use of any content with a different license, please contact the author.
 * 
 * @author Mitchel Strachan <technotheist@gmail.com>
 */
public abstract class LSTMNet extends Module {

    
    protected abstract class LSTMNetRunner extends Runner {
        
        protected final float[] inputErr;
        protected final float[] outputErr;
        //
        public final float Q;
        private final int[] T = new int[1];
        int layerCnt;
        private final int[] laySize;
        private final int[] layNode0;
        //
        //**** **** **** ****
        //Values
        private final float[] Pstore;
        private final float[] Perr;
        private final float[] Mstore;
        private final float[] Merr;
        private final float[] Fstore;
        private final float[] Ferr;
        //
        //**** **** **** **** 
        //Connection weights
        private final float[] F2P_Weight;
        private final float[] B2P_Weight;
        //
        private final float[] P2M_Weight;
        private final float[] M2M_Weight;
        //
        private final float[] M2F_Weight;
        //
        private final float[] P2N_Weight;
        private final float[] L2N_Weight;
        private final float[] M2N_Weight;
        private final float[] F2N_Weight;
        //---
        private final float[] F2P_DW;
        private final float[] B2P_DW;
        //
        private final float[] P2M_DW;
        private final float[] M2M_DW;
        //
        private final float[] M2F_DW;
        //---
        private final float[] F2P_DWA;
        private final float[] B2P_DWA;
        //
        private final float[] P2M_DWA;
        private final float[] M2M_DWA;
        //
        private final float[] M2F_DWA;
        private final float[] F2F_DWA;
        //---
        private final float[] F2P_Mu;
        private final float[] B2P_Mu;
        //
        private final float[] P2M_Mu;
        private final float[] M2M_Mu;
        //
        private final float[] M2F_Mu;
        private final float[] F2F_Mu;


        public LSTMNetRunner(float[] inputErr, float[] outputErr, float Q, int[] laySize, int[] layNode0, float[] Pstore, float[] Perr, float[] Mstore, float[] Merr, float[] Fstore, float[] Ferr, float[] F2P_Weight, float[] B2P_Weight, float[] P2M_Weight, float[] M2M_Weight, float[] M2F_Weight, float[] P2N_Weight, float[] L2N_Weight, float[] M2N_Weight, float[] F2N_Weight, float[] F2P_DW, float[] B2P_DW, float[] P2M_DW, float[] M2M_DW, float[] M2F_DW, float[] F2P_DWA, float[] B2P_DWA, float[] P2M_DWA, float[] M2M_DWA, float[] M2F_DWA, float[] F2F_DWA, float[] F2P_Mu, float[] B2P_Mu, float[] P2M_Mu, float[] M2M_Mu, float[] M2F_Mu, float[] F2F_Mu, BaseConfig config) {
            super(config);
            this.inputErr = inputErr;
            this.outputErr = outputErr;
            this.Q = Q;
            this.laySize = laySize;
            this.layNode0 = layNode0;
            this.Pstore = Pstore;
            this.Perr = Perr;
            this.Mstore = Mstore;
            this.Merr = Merr;
            this.Fstore = Fstore;
            this.Ferr = Ferr;
            this.F2P_Weight = F2P_Weight;
            this.B2P_Weight = B2P_Weight;
            this.P2M_Weight = P2M_Weight;
            this.M2M_Weight = M2M_Weight;
            this.M2F_Weight = M2F_Weight;
            this.P2N_Weight = P2N_Weight;
            this.L2N_Weight = L2N_Weight;
            this.M2N_Weight = M2N_Weight;
            this.F2N_Weight = F2N_Weight;
            this.F2P_DW = F2P_DW;
            this.B2P_DW = B2P_DW;
            this.P2M_DW = P2M_DW;
            this.M2M_DW = M2M_DW;
            this.M2F_DW = M2F_DW;
            this.F2P_DWA = F2P_DWA;
            this.B2P_DWA = B2P_DWA;
            this.P2M_DWA = P2M_DWA;
            this.M2M_DWA = M2M_DWA;
            this.M2F_DWA = M2F_DWA;
            this.F2F_DWA = F2F_DWA;
            this.F2P_Mu = F2P_Mu;
            this.B2P_Mu = B2P_Mu;
            this.P2M_Mu = P2M_Mu;
            this.M2M_Mu = M2M_Mu;
            this.M2F_Mu = M2F_Mu;
            this.F2F_Mu = F2F_Mu;
        }
        
        
    }
}
